package Servicios;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;


@Path("Cliente")
public class Cliente {
	private static String db ="bd_sada";
	private static String url ="jdbc:mysql://localhost:3306/"+db;
	private static String user = "root";
	private static String pass="root";
	
	@GET
	@Path("/actualizarAmbulancia/{latitud}/{longitud}/{placa}")
	@Produces(MediaType.APPLICATION_JSON)
	public Respuesta actualizarAmbulancia(@PathParam("latitud") String latitud,
			@PathParam("longitud")String longitud,@PathParam("placa")String placa){
		Respuesta respuesta = new Respuesta();
		respuesta.setRespuesta("ok");
		try {
			Class.forName("org.gjt.mm.mysql.Driver");
		
	        Connection conexion = DriverManager.getConnection (url,user,pass);
			 String query = "update ambulancia set latitud = ? , longitud = ? where PlacaAmbulancia = ?";
	         PreparedStatement preparedStmt2 = conexion.prepareStatement(query);
	                           
	         preparedStmt2.setString(1, latitud);
	         preparedStmt2.setString(2, longitud);
	         preparedStmt2.setString(3, placa);
	         preparedStmt2.executeUpdate();
		}
        catch (Exception e)
        {
        	e.printStackTrace();
        }
		return respuesta;
	}
	
	@GET
	@Path("/desocuparAmbulancia/{placa}")
	@Produces(MediaType.APPLICATION_JSON)
	public Respuesta desocuparAmbulancia(@PathParam("placa")String placa){
		Respuesta respuesta = new Respuesta();
		respuesta.setRespuesta("ok");
		try {
			Class.forName("org.gjt.mm.mysql.Driver");
	        Connection conexion = DriverManager.getConnection (url,user,pass);
			
            String query = "update ambulancia set EstadoAmbulancia = ? where PlacaAmbulancia = ?";
            PreparedStatement preparedStmt2 = conexion.prepareStatement(query);
                              
            preparedStmt2.setString(1, "Si" );
            preparedStmt2.setString(2, placa);
            preparedStmt2.executeUpdate();
		}
        catch (Exception e)
        {
        	e.printStackTrace();
        }
		return respuesta;
	}
	
	
	
	@GET
	@Path("/PedirAmbulancia/{latitud}/{longitud}/{comentarios}")
	@Produces(MediaType.APPLICATION_JSON)
	public DatosCliente PedirAmbulancia(@PathParam("latitud") String latitud,
			@PathParam("longitud")String longitud, @PathParam("comentarios")String comentarios){
		//consumir json de google
		DatosCliente datosCliente=new DatosCliente();
		
		//************************
		String placa="";
		int tiempo;
		String CC="";
		List<Ambulancia> lista = new ArrayList<Ambulancia>();
		lista=listaAmbulancias();
		//************************
		if(lista==null){
			datosCliente.setPlacaAmbulancia("");
			datosCliente.setTiempoDeEspera("");
			return datosCliente;
		}
		Ambulancia ambulancia=new Ambulancia();
		ambulancia=lista.get(0);
		placa=ambulancia.getPlaca();
		tiempo=tiempo(ambulancia.getLatitud(), ambulancia.getLongitud(),latitud,longitud);
		for(int i=1; i<lista.size();i++){
			Ambulancia a=new Ambulancia();
			a=lista.get(i);
			int tiempoaux=tiempo(a.getLatitud(), a.getLongitud(),latitud,longitud);
			System.out.println(".................."+tiempoaux+"++++++++++++++++");
			if(tiempoaux<tiempo){
				tiempo=tiempoaux;
				CC=a.getCC();
				placa=a.getPlaca();
			}
		}
		
		datosCliente.setPlacaAmbulancia(placa);
		datosCliente.setTiempoDeEspera(tiempo+"");
		 //falta realizar registro
		
		insertarAcualizar(latitud, longitud, comentarios, placa, CC);

	
		
        
		return datosCliente;
	
}
	
	public static void insertarAcualizar(String latitud, String longitud, String comentarios,
			String placa, String CC){
		
		System.out.println("lat: "+latitud+" lon: "+longitud+ " comentarios: "+comentarios
				+" placa "+placa+ " CC: "+CC);
		try{
			Class.forName("org.gjt.mm.mysql.Driver");
	        Connection conexion = DriverManager.getConnection (url,user,pass);
			String insertQuery = "INSERT INTO servicio (Latitud, Longitud, ComentarioServicio, Ambulancia_PlacaAmbulancia, Ambulancia_C)" + " values(?,?,?,?,?)";
	        
	        // Insert Query
	        // create the mysql insert preparedstatement
	        PreparedStatement preparedStmt = (PreparedStatement) conexion.prepareStatement(insertQuery);
	        preparedStmt.setString (1, latitud);
	        preparedStmt.setString (2, longitud);
	        preparedStmt.setString (3, comentarios);
	        preparedStmt.setString (4, placa);
	        preparedStmt.setString (5, CC);      
	        preparedStmt.execute();
	        
	        Statement s = conexion.createStatement();
	        
	                    
            String query = "update ambulancia set EstadoAmbulancia = ? where PlacaAmbulancia = ?";
            PreparedStatement preparedStmt2 = conexion.prepareStatement(query);
                              
            preparedStmt2.setString(1, "No" );
            preparedStmt2.setString(2, placa);
            preparedStmt2.executeUpdate();
		}
        catch (Exception e)
        {
        	e.printStackTrace();
        }
	}
		
	public static int tiempo(String latitudConductor, String longitudConductor, 
			String latitud, String longitud){
		
	try{
		URL url = new URL("http://maps.googleapis.com/maps/api/distancematrix/json?"
				+ "origins="+latitudConductor+","+longitudConductor+"&"
				+ "destinations="+latitud+","+longitud
				+ "&mode=driving&language=fr-FR&sensor=false");
		System.out.println(url);
		//URL url=new URL("http://maps.googleapis.com/maps/api/distancematrix/json?origins=6.297310,%20-75.556896&destinations=6.177517,%20-75.600842&mode=driving&language=fr-FR&sensor=false");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setRequestProperty("Accept", "application/json");
 
		if (conn.getResponseCode() != 200) {
			throw new RuntimeException("Failed : HTTP error code : "
					+ conn.getResponseCode());
		}
 
		BufferedReader br = new BufferedReader(new InputStreamReader(
			(conn.getInputStream())));
 
		String output;
		String Tiempoaux="";
		System.out.println("Output from Server .... \n");
		int cont=0;
		
		while ((output = br.readLine()) != null) {
			System.out.println(output);
			if(cont==12)Tiempoaux=output;
			cont++;
		}		
		conn.disconnect();
		
		String Tiempo="";
		StringTokenizer st = new StringTokenizer(Tiempoaux, ":");
        Tiempo = st.nextToken();
        Tiempo = st.nextToken();
        String Tiempo2="";
        for(int i=0;i<Tiempo.length();i++){
        	if(isNumeric(Tiempo.charAt(i))){
        		Tiempo2=Tiempo2+Tiempo.charAt(i);
        	}
        		
        }
        return Integer.parseInt(Tiempo2);
        
	 } catch (MalformedURLException e) {
		 
			e.printStackTrace();
	 
		  } catch (IOException e) {
	 
			e.printStackTrace();
	 
		  }
	return 0;
	}
	
	
	public static List<Ambulancia> listaAmbulancias(){
		System.out.println("entra");
		List<Ambulancia> lista = new ArrayList<Ambulancia>();

		
		   try
	        {
	            // Se registra el Driver de MySQL
	            //DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
	            Class.forName("org.gjt.mm.mysql.Driver");
	            
	            Connection conexion = DriverManager.getConnection (url,user,pass);
	            Statement s = conexion.createStatement();
	            
	            String selectquery = "select PlacaAmbulancia, latitud, longitud, Conductor_CedulaConductor"
	            		+ " from ambulancia"
	            		+ " WHERE EstadoAmbulancia= 'Si'";
	            ResultSet rs = s.executeQuery(selectquery);
	            System.out.println("antes del ciclo");
	            // Se recorre el ResultSet, mostrando por pantalla los resultados.
	            while (rs.next()){
	            	System.out.println("datos: "+rs.getString(1)+rs.getString(2)+rs.getString(3));
		            Ambulancia ambulancia=new Ambulancia();
		            ambulancia.setPlaca(rs.getString(1));
		            ambulancia.setLatitud(rs.getString(2));
		            ambulancia.setLongitud(rs.getString(3));
		            ambulancia.setCC(rs.getString(4));
		            lista.add(ambulancia);
	            }
	            
	            
	         
	        }
	        catch (Exception e)
	        {
	           return null;
	        }
	        return lista;
	}
	
	
	private static boolean isNumeric(char c){
		String cadena=c+"";
		try {
			Integer.parseInt(cadena);
			return true;
		} catch (NumberFormatException nfe){
			return false;
		}
	}
	

}
